#include "../../tools.h"
// LeetCode #8
// 读入字符串并丢弃无用的前导空格
// 检查下一个字符（假设还未到字符末尾）为正还是负号，读取该字符（如果有）。 
    // 确定最终结果是负数还是正数。 如果两者都不存在，则假定结果为正。
// 读入下一个字符，直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
// 将前面步骤读入的这些数字转换为整数（即，"123" -> 123， "0032" -> 32）。如果没有读入数字，则整数为 0 。
    // 必要时更改符号（从步骤 2 开始）。
// 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。
    // 具体来说，小于 −231 的整数应该被固定为 −231 ，大于 231 − 1 的整数应该被固定为 231 − 1 。
// 返回整数作为最终结果。
class Solution {
public:
    // int imax = 1 >> 32;
    // int imin = 1;
    int myAtoi(string s) {
        int i = 0, start, end;
        while(s[i] == ' ') ++i;

        bool isneg = s[i] == '-';
        if(s[i] == '-' || s[i] == '+') ++i;
        else if(s[i] < '0' && s[i] > '9') return 0;

        start = i;
        long res = 0L;
        while(s[i] >= '0' && s[i] <= '9'){
            res = 10 * res + (s[i] - '0');
            if(!isneg && res > INT32_MAX) return INT32_MAX;
            if(isneg && res > long(INT32_MAX) + 1) return INT32_MIN;
            ++i;
        }
        if(!isneg) return res;
        else return -res;


    }
};


int main(int argc, char const *argv[])
{
    Solution s;
    string str = "-91283472332";

    cout << s.myAtoi(str) << endl;

    int imin = 1 << 31;         // 补码
    int imax = (1 << 31) - 1;   // 最小负数减一就是最大整数

    cout << imax << endl;

    return 0;
}
